متد onContextMenu برای ایتم های ریسایکلر ویو ( فعلا حل شد )
به نام خدا ..
سلام دوستان .. امیدوارم حالتون خوب باشه
من بعد از سرچ متوجه شدم که ججور برای ایتم های RecyclerView یک contextMenu بسازم
ینی اومدم کلاسMyViewHoldert رو ک یک کلاس داخلی در کلاس اداپترم رو بود از
View.OnCreateContextMenuListener
ایمپلیمنت کردم و اوکی شد . نیگا کنید این کد من :
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener{
private TextView txt_tittle , txt_genre , txt_year;
private ViewGroup relative_content;
public MyViewHolder(View view) {
super(view);
txt_tittle = (TextView) view.findViewById(R.id.txt_tittle);
txt_genre = (TextView) view.findViewById(R.id.txt_genre);
txt_year = (TextView) view.findViewById(R.id.txt_year);
relative_content = (ViewGroup) view.findViewById(R.id.relative_content);
view.setOnCreateContextMenuListener(this);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
menu.setHeaderTitle("Select The Action");
menu.add(0 , view.getId() , 0 , "Call");
menu.add(0 , view.getId() , 0 , "SMS");
}
}
خب حالا من اینو ساختم و اوکی شد . ولی حالا میخوام متد
boolean onContextItemSelected(MenuItem item);
رو برای انتخاب ایتم های منو بنویسم نمیشه
اونو نمیشناسه ... چون کلاسم از activity مشتق نشده ..
حالا کسی هست راهنمایی کنه ؟ ممنون میشم بچه ها :)
دوستان کسی نظری نداره ؟ واقعا درگیرشم ...
حتی اومدم متد های `onCreateContextMenu` و` onContextItemSelected` رو اوردم کلاس اصلیم که extends از AppCompat هست نوشتم .
اوکی بود چون جنسش اکتیوتی بود شناخت ولی برای `registerForContextMenu` دچار مشکل شدم :( !
همونجور که میدونید ورودی این متد یک view هست و من میخوام لایه ی زیر ساخت برای هر سطر از ریسایکر ویویو ام رو بهش بدوم همون RelativeLayout که چنتا ویو رو برای طراحی هر سطر از ریسایکلر ویو ام میگیره .
خب این که لایه ای مرتبط به اکتیویتی اصلیم نیس که راحت بتونم بگیرمش پس مجبور شدم در کلاس G که extends Application هست بنویسم که همه جا در دسترس باشه:
public static RelativeLayout relative_content;
و در کلاس داخلی اداپترم که خودم ساختم که `public class MyViewHolder extends RecyclerView.ViewHolder ` این باشه تعریفش کردم :
به اینصورت `;(G.relative_content = (RelativeLayout) view.findViewById(R.id.relative_content)` مثل بقیه ی ویو ها !
خب حالا من چجور این ویو رو به کلاس اصلیم و به متد
registerForContextMenu
مربوطش کنم ؟
من مبتدیم و کلی کارهای غیر منطقی انجام دادم که یکیشوناین بود که اینجور نوشتم
registerForContextMenu(G.relative_content);
ینی اومد همون relative رو که در کلاس G تعریف کردم دادم ولی خطای
java.lang.NullPointerException رو برمیگردوند :)
حتی اینجور نوشتم :
if(G.relative_content != null){
registerForContextMenu(G.relative_content);
}else{
Toast.makeText(G.context, "NOOOOOOO", Toast.LENGTH_SHORT).show();
بهم ارورو NULL نداد ولی همون NOOOO رو داد که ینی مقداری نداره و null هست !
و یا حتی try catch ههههههههههه
try {
registerForContextMenu(G.relative_content);
}catch (NullPointerException e){
e.printStackTrace();
}
هیچ کدوم اوکی نشد ینی ارور رفت ولی نتیجه ای رو ندیدم :(
دوستان چه راه حل هایی رو پیشنهاد میدید ؟
استفاده از دیالوگ بهتره،چون هر طور که بخواین می تونید سفارشی سازیش کنین.
اما همانطور که گفتم اگه همه جوابای اون لینک رو می خوندین،می تونستین همین روشی که اینجا مطرح کردین رو هم استفاده کنید.
به هر حال اگه خواستین از همین روش استفاده کنین،می تونید از کدای زیر استفاده کنید.
(من بجای view.getId از اعداد 1 و 2 استفاده کردم و توی اکتیویتی هم همین مقادیرو توی switch استفاده کردم)
1 - کدای کلاس RecyclerView تون رو مثه کدای زیر تغییر بدین :
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>
{
//...
public int position;
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
//...
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
setPosition(position);
return false;
}
});
}
@Override
public void onViewRecycled(ViewHolder holder) {
holder.itemView.setOnLongClickListener(null);
super.onViewRecycled(holder);
}
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener
{
//...
public ViewHolder(View itemLayoutView)
{
super(itemLayoutView);
//...
itemLayoutView.setOnCreateContextMenuListener(this);
}
@Override
public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
contextMenu.setHeaderTitle("Select The Action");
contextMenu.add(0, 1, 0, "Call");//groupId, itemId, order, title
contextMenu.add(0, 2, 0, "SMS");
}
}
}
2 - تو اکتیویتی شامل RecyclerView هم متد زیر رو قرار بدین :
@Override
public boolean onContextItemSelected(MenuItem item) {
int position;
try {
position = mAdapter.getPosition();
} catch (Exception e) {
Log.d("myTAG", e.getLocalizedMessage(), e);
return super.onContextItemSelected(item);
}
switch (item.getItemId()) {
case 1:
// do your stuff
Toast.makeText(mainPage.this, "(Call)position = " + position, Toast.LENGTH_SHORT).show();
break;
case 2:
// do your stuff
Toast.makeText(mainPage.this, "(SMS)position = " + position, Toast.LENGTH_SHORT).show();
break;
}
return super.onContextItemSelected(item);
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .
